package com.urbainski.estagio.negocio;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.urbainski.dao.bo.GenericBO;
import com.urbainski.estagio.entidade.Aluno;
import com.urbainski.estagio.entidade.Curso;
import com.urbainski.estagio.entidade.Turma;

/**
 * @author Cristian Elder Urbainski
 * @since 25/12/2011
 */

public class CursoBO extends GenericBO {

	@SuppressWarnings("unchecked")
	public List<Curso> buscarCursos() throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			List<Curso> listaCurso = getUrbainskiDao().getSessao().createCriteria(Curso.class)
					.createAlias("coordenador", "coordenador", Criteria.INNER_JOIN)
					.addOrder(Order.asc("nmCurso"))
					.list();

			for(Curso c : listaCurso){
				c.setListaAluno(null);
				c.getCoordenador().setEndereco(null);
				
				c.setListaTurma(getUrbainskiDao().getSessao().createCriteria(Turma.class)
						.add(Restrictions.eq("idCurso", c.getIdCurso()))
						.list());
				
				for(Turma t : c.getListaTurma()){
					t.setCurso(c);
					
					t.setListaAluno(getUrbainskiDao().getSessao().createCriteria(Aluno.class)
							.add(Restrictions.eq("idTurma", t.getIdTurma()))
							.addOrder(Order.asc("nmAluno"))
							.list());
					
					for(Aluno aluno : t.getListaAluno()){
						aluno.setCurso(null);
						aluno.setTurma(null);
						aluno.setListaNota(null);
						aluno.setListaPresenca(null);
					}
					
					t.setListaMateria(null);
					t.setListaProfessor(null);
				}
			}
			
			getUrbainskiDao().commitTrans();
			return listaCurso;
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
	}
	
	public Curso salvarCurso(Curso curse) throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			getUrbainskiDao().salvar(curse);
			
			for(Turma t : curse.getListaTurma()){
				t.setIdCurso(curse.getIdCurso());
				getUrbainskiDao().salvar(t);
			}
			
			getUrbainskiDao().commitTrans();
			return curse;
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
	}
	
	public Curso alterarCurso(Curso curse) throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			getUrbainskiDao().altualizar(curse);
			
			for(Turma t : curse.getListaTurma()){
				if(t.getIdTurma() == null){
					t.setIdCurso(curse.getIdCurso());
					getUrbainskiDao().salvar(t);
				} else {
					getUrbainskiDao().altualizar(t);
				}
			}
			
			getUrbainskiDao().commitTrans();
			return curse;
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
	}
	
	public Curso excluirCurso(Curso curse) throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			for(Turma t : curse.getListaTurma()){
				getUrbainskiDao().excluir(t);
			}
			
			getUrbainskiDao().excluir(curse);
			
			getUrbainskiDao().commitTrans();
			return curse;
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
	}
	
	public Boolean excluirTurma(Turma t) throws Exception {
		try {
			getUrbainskiDao().beginTras();
			
			getUrbainskiDao().excluir(t);
			
			getUrbainskiDao().commitTrans();
		} catch (Exception e) {
			e.printStackTrace();
			getUrbainskiDao().rollbackTrans();
			throw e;
		}
		
		return true;
	}
}
